IAM Identity Centerの所属するユーザー名とグループ名のリストをシェルスクリプトで抽出してみた
みなさんこんにちは、杉金です。
少し前のアップデートで念願のAWS IAM Identity Center APIが更新されまして、ユーザーやグループの設定変更や情報取得できる範囲が拡張されました。グループに所属するユーザーやユーザーが所属するグループを取得できるようになったのですが、取得できる情報がIDであるため、IDを名前に置き換えてCSVで出力するスクリプトを作ってみました。
(2022/10/31更新)以下のブログで、Pythonを使って所属グループだけでなく、権限割り当て一覧も取得できます。ユーザーの棚卸しをしたい場合はこちらのブログが参考になります。
アップデート情報
以下のリンクがアップデート内容でして、この中の2つのAPIで所属ユーザーとグループの情報が取得できます。
- ListGroupMembershipsForMember:対象ユーザーが所属するグループのリスト
- ListGroupMemberships:対象グループに所属するユーザーのリスト
ユーザーとグループの作成、更新、削除については以下のブログが参考になります。
グループ名と所属するユーザー名の一覧
スクリプトを実行することで以下のようなリストが取得できます。左端がグループ名で横に所属するユーザー名がカンマ区切りで続きます。
group_name,user_name group1,hijikata_toshizo,okita_soji group2,nagakura_shinpachi,hijikata_toshizo group3,hijikata_toshizo,saito_hajime group4,saito_hajime,hijikata_toshizo group9
group9のように、所属ユーザーがいないグループも取得できますので、使ってなさそうなグループの洗い出しに使えます。以下がシェルスクリプトのコードです。5〜10行目まではご自身の環境に応じて修正ください。
#!/bin/bash export AWS_PAGER="" # IAM Identity CenterのストアID store_id="d-XXXXXX" # IAM Identity Centerを利用しているリージョン region="ap-northeast-1" # 出力ファイル名 output_file=list-users-in-group.csv userlist=$(aws identitystore list-users --identity-store-id ${store_id} --region ${region}) grouplist=$(aws identitystore list-groups --identity-store-id ${store_id} --region ${region} --query 'sort_by(Groups, &DisplayName)[].[GroupId,DisplayName]') echo "group_name,user_name" > ${output_file} for group in $(echo ${grouplist} | jq -r '.[] | .[0] + ":" + .[1]'); do output_line=${group#*:} for userid in $(aws identitystore list-group-memberships --identity-store-id $store_id --group-id ${group%:*} | jq -r '.[][] | .MemberId.UserId'); do username=$(echo $userlist | jq -r '.Users[] | select(.UserId == "'${userid}'" ) | .UserName') output_line=${output_line}","${username} done echo ${output_line} >> ${output_file} done
ユーザー名と所属するグループ名の一覧
スクリプトを実行することで以下のようなリストが取得できます。左端がユーザー名で横に所属するグループ名がカンマ区切りで続きます。
user_name,group_name hijikata_toshizo,group1,group3,group2,group4 ito_kashitaro nagakura_shinpachi,group2 okita_soji,group1 saito_hajime,group4,group3
ito_kashitaroのように、グループに所属していないユーザーの洗い出しに使えます。以下がシェルスクリプトのコードです。5〜10行目まではご自身の環境に応じて修正ください。
#!/bin/bash export AWS_PAGER="" # IAM Identity CenterのストアID store_id="d-XXXXXX" # IAM Identity Centerを利用しているリージョン region="ap-northeast-1" # 出力ファイル名 output_file=list-groups-for-user.csv userlist=$(aws identitystore list-users --identity-store-id ${store_id} --region ${region} --query 'sort_by(Users, &UserName)') grouplist=$(aws identitystore list-groups --identity-store-id ${store_id} --region ${region}) echo "user_name,group_name" > $output_file for userid in $(echo ${userlist} | jq -r '.[].UserId'); do output_line=$(echo ${userlist} | jq -r '.[] | select(.UserId == "'${userid}'" ) | .UserName') for groupid in $(aws identitystore list-group-memberships-for-member --identity-store-id ${store_id} --member-id "{ \"UserId\":\"${userid}\" }" --query 'GroupMemberships[*].GroupId' | jq -r '.[]'); do group_name=$(echo ${grouplist} | jq -r '.[][] | select(.GroupId == "'${groupid}'") | .DisplayName') output_line=${output_line}","${group_name} done echo ${output_line} >> ${output_file} done
動作確認環境
$aws --version aws-cli/2.7.31 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off $bash --version GNU bash, バージョン 5.1.16(1)-release (aarch64-apple-darwin21.1.0) $jq --version jq-1.6
改善の余地あり
今回のスクリプトですが、改善の余地があります。
- シェルスクリプトであるため、Windowsユーザーに優しくない
- 所属するユーザーやグループの並びがランダム
- アクセス許可セットと組み合わせて誰が何の権限を持っているかをリスト化したい
- 表示名やメールアドレスなど表示するユーザー情報をカスタマイズできるようにしたい
- 処理に少し時間がかかるので進捗状況を表したい
1点目は、PowerShell版を作るかPython版を作るか検討中です。2点目以降を考えるとPythonでユーティリティツールみたいなの作れるといいかもと思ってます。
最後に
改善点を盛り込んでから公開しようかと思いましたが、時間がかかりそうであるため一旦今のレベルで公開してみました。上記に挙げた改善点以外にもコード全体の構成などのより良くなりそうな要素は他にもあると思っていますので、アップグレードしてくれる方を歓迎します。jqの試行錯誤やスクリプト作成にとても助かったリンクを参考情報として記載します。